diff --git a/.images/CreateMySQLDB_no_drop.sql b/.images/CreateMySQLDB_no_drop.sql new file mode 100644 index 0000000..3a21820 --- /dev/null +++ b/.images/CreateMySQLDB_no_drop.sql @@ -0,0 +1,260 @@ + + +USE SBFspot; + +CREATE Table Config ( + `Key` varchar(32), + `Value` varchar(200), + PRIMARY KEY (`Key`) +); + +INSERT INTO Config VALUES('SchemaVersion','2'); + +CREATE Table Inverters ( + Serial int unsigned NOT NULL, + Name varchar(32), + Type varchar(32), + SW_Version varchar(32), + TimeStamp int, + TotalPac int, + EToday bigint, + ETotal bigint, + OperatingTime double, + FeedInTime double, + Status varchar(10), + GridRelay varchar(10), + Temperature float, + PRIMARY KEY (Serial) +); + +CREATE View vwInverters AS + Select Serial, + Name,Type,SW_Version, + From_UnixTime(TimeStamp) AS TimeStamp, + TotalPac, + EToday,ETotal, + OperatingTime,FeedInTime, + Status,GridRelay, + Temperature + FROM Inverters; + +CREATE Table SpotData ( + TimeStamp int NOT NULL, + Serial int unsigned NOT NULL, + Pdc1 int, Pdc2 int, + Idc1 float, Idc2 float, + Udc1 float, Udc2 float, + Pac1 int, Pac2 int, Pac3 int, + Iac1 float, Iac2 float, Iac3 float, + Uac1 float, Uac2 float, Uac3 float, + EToday bigint, ETotal bigint, + Frequency float, + OperatingTime double, + FeedInTime double, + BT_Signal float, + Status varchar(10), + GridRelay varchar(10), + Temperature float, + PRIMARY KEY (TimeStamp, Serial) +); + +-- Fix 02-MAY-2016 See Issue 150 +CREATE View vwSpotData AS + Select From_UnixTime(Dat.TimeStamp) AS TimeStamp, + From_UnixTime(CASE WHEN (Dat.TimeStamp % 300) < 150 + THEN Dat.TimeStamp - (Dat.TimeStamp % 300) + ELSE Dat.TimeStamp - (Dat.TimeStamp % 300) + 300 + END) AS Nearest5min, + Inv.Name, + Inv.Type, + Dat.Serial, + Pdc1, Pdc2, + Idc1, Idc2, + Udc1, Udc2, + Pac1, Pac2, Pac3, + Iac1, Iac2, Iac3, + Uac1, Uac2, Uac3, + Pdc1+Pdc2 AS PdcTot, + Pac1+Pac2+Pac3 AS PacTot, + CASE WHEN Pdc1+Pdc2 = 0 THEN + 0 + ELSE + CASE WHEN Pdc1+Pdc2>Pac1+Pac2+Pac3 THEN + ROUND((Pac1+Pac2+Pac3)/(Pdc1+Pdc2)*100,1) + ELSE + 100.0 + END + END AS Efficiency, + Dat.EToday, + Dat.ETotal, + Frequency, + Dat.OperatingTime, + Dat.FeedInTime, + ROUND(BT_Signal,1) AS BT_Signal, + Dat.Status, + Dat.GridRelay, + ROUND(Dat.Temperature,1) AS Temperature + FROM SpotData Dat +INNER JOIN Inverters Inv ON Dat.Serial=Inv.Serial; + +CREATE Table DayData ( + TimeStamp int NOT NULL, + Serial int unsigned NOT NULL, + TotalYield bigint, + Power bigint, + PVoutput int(1), + PRIMARY KEY (TimeStamp, Serial) +); + +CREATE View vwDayData AS + select From_UnixTime(Dat.TimeStamp) AS TimeStamp, + Inv.Name, Inv.Type, Dat.Serial, + TotalYield, + Power, + PVOutput FROM DayData Dat +INNER JOIN Inverters Inv ON Dat.Serial=Inv.Serial +ORDER BY Dat.Timestamp Desc; + +CREATE Table MonthData ( + TimeStamp int NOT NULL, + Serial int unsigned NOT NULL, + TotalYield bigint, + DayYield bigint, + PRIMARY KEY (TimeStamp, Serial) +); + +CREATE View vwMonthData AS + select convert_tz(from_unixtime(Dat.TimeStamp), 'SYSTEM', '+00:00') AS TimeStamp, + Inv.Name, Inv.Type, Dat.Serial, + TotalYield, DayYield FROM MonthData Dat +INNER JOIN Inverters Inv ON Dat.Serial=Inv.Serial +ORDER BY Dat.Timestamp Desc; + +CREATE Table EventData ( + EntryID int unsigned, + TimeStamp int NOT NULL, + Serial int unsigned NOT NULL, + SusyID smallint unsigned, + EventCode int unsigned, + EventType varchar(32), + Category varchar(32), + EventGroup varchar(32), + Tag varchar(200), + OldValue varchar(64), + NewValue varchar(64), + UserGroup varchar(10), + PRIMARY KEY (Serial, EntryID) +); + +CREATE View vwEventData AS + select From_UnixTime(Dat.TimeStamp) AS TimeStamp, + Inv.Name, Inv.Type, Dat.Serial, + SusyID, EntryID, + EventCode, EventType, + Category, EventGroup, Tag, + OldValue, NewValue, + UserGroup FROM EventData Dat +INNER JOIN Inverters Inv ON Dat.Serial=Inv.Serial +ORDER BY EntryID Desc; + +CREATE Table Consumption ( + TimeStamp int NOT NULL, + EnergyUsed int, + PowerUsed int, + PRIMARY KEY (TimeStamp) +); + +CREATE VIEW vwConsumption AS + SELECT From_UnixTime(TimeStamp) As Timestamp, + From_UnixTime(CASE WHEN (TimeStamp % 300) < 150 + THEN TimeStamp - (TimeStamp % 300) + ELSE TimeStamp - (TimeStamp % 300) + 300 + END) AS Nearest5min, + EnergyUsed, + PowerUsed + FROM Consumption; + +-- Fix 02-MAY-2016 See Issue 150 +CREATE VIEW vwAvgConsumption AS + SELECT Nearest5min, + cast(avg(EnergyUsed) As decimal(9)) As EnergyUsed, + cast(avg(PowerUsed) As decimal(9)) As PowerUsed + FROM vwConsumption + GROUP BY Nearest5Min; + +CREATE VIEW vwAvgSpotData AS + SELECT nearest5min, + serial, + cast(avg(Pdc1) as decimal(9)) AS Pdc1, + cast(avg(Pdc2) as decimal(9)) AS Pdc2, + cast(avg(Idc1) as decimal(9,3)) AS Idc1, + cast(avg(Idc2) as decimal(9,3)) AS Idc2, + cast(avg(Udc1) as decimal(9,2)) AS Udc1, + cast(avg(Udc2) as decimal(9,2)) AS Udc2, + cast(avg(Pac1) as decimal(9)) AS Pac1, + cast(avg(Pac2) as decimal(9)) AS Pac2, + cast(avg(Pac3) as decimal(9)) AS Pac3, + cast(avg(Iac1) as decimal(9,3)) AS Iac1, + cast(avg(Iac2) as decimal(9,3)) AS Iac2, + cast(avg(Iac3) as decimal(9,3)) AS Iac3, + cast(avg(Uac1) as decimal(9,2)) AS Uac1, + cast(avg(Uac2) as decimal(9,2)) AS Uac2, + cast(avg(Uac3) as decimal(9,2)) AS Uac3, + cast(avg(Temperature) as decimal(9,2)) AS Temperature + FROM vwSpotData + GROUP BY serial, nearest5min; + +CREATE VIEW vwPvoData AS + SELECT dd.Timestamp, + dd.Name, + dd.Type, + dd.Serial, + dd.TotalYield AS V1, + dd.Power AS V2, + cons.EnergyUsed AS V3, + cons.PowerUsed AS V4, + spot.Temperature AS V5, + spot.Uac1 AS V6, + NULL AS V7, + NULL AS V8, + NULL AS V9, + NULL AS V10, + NULL AS V11, + NULL AS V12, + dd.PVoutput + FROM vwDayData AS dd + LEFT JOIN vwAvgSpotData AS spot + ON dd.Serial = spot.Serial AND dd.Timestamp = spot.Nearest5min + LEFT JOIN vwAvgConsumption AS cons + ON dd.Timestamp = cons.Nearest5min + ORDER BY dd.Timestamp DESC; + +-- Fix 09-JAN-2017 See Issue 54: SQL Support for battery inverters +CREATE TABLE SpotDataX ( + `TimeStamp` int NOT NULL, + `Serial` int unsigned NOT NULL, + `Key` int NOT NULL, + `Value` int, + PRIMARY KEY ( + `TimeStamp` ASC, + `Serial` ASC, + `Key` + ) +); + +DROP VIEW IF EXISTS vwBatteryData; + +CREATE VIEW vwBatteryData AS + SELECT FROM_UNIXTIME(sdx.`TimeStamp` - (sdx.`TimeStamp` % 300)) AS `5min`, + sdx.`Serial`, + inv.`Name`, + AVG(CASE WHEN `Key` = 10586 THEN `Value` END) AS ChaStatus, + AVG(CASE WHEN `Key` = 18779 THEN CAST(`Value` AS DECIMAL(10,1)) / 10 END) AS Temperature, + AVG(CASE WHEN `Key` = 18781 THEN CAST(`Value` AS DECIMAL(10,3)) / 1000 END) AS ChaCurrent, + AVG(CASE WHEN `Key` = 18780 THEN CAST(`Value` AS DECIMAL(10,2)) / 100 END) AS ChaVoltage, + AVG(CASE WHEN `Key` = 17974 THEN `Value` END) AS GridMsTotWOut, + AVG(CASE WHEN `Key` = 17975 THEN `Value` END) AS GridMsTotWIn + FROM SpotDataX AS sdx + INNER JOIN + Inverters AS inv ON sdx.Serial = inv.`Serial` + GROUP BY `5min`; diff --git a/.images/Example_Config.yaml b/.images/Example_Config.yaml new file mode 100644 index 0000000..693eabf --- /dev/null +++ b/.images/Example_Config.yaml @@ -0,0 +1,48 @@ +BTAddress: 00:00:00:00:00:00 +Password: Your_Sunny_Explorer_Password +MIS_Enabled: 0 +Plantname: YourPlantname +OutputPath: /data/sbfspot/%Y +OutputPathEvents: /data/sbfspot/%Y/events +Latitude: null +Longitude: null +CalculateMissingSpotValues: 1 +DateTimeFormat: '%d/%m/%Y %H:%M:%S' +DateFormat: '%d/%m/%Y' +DecimalPoint: comma +TimeFormat: '%H:%M:%S' +SynchTime: 7 +SynchTimeLow: 1 +SynchTimeHigh: 3600 +SunRSOffset: 900 +Locale: en-US +Timezone: YourCountry/YourCity +BTConnectRetries: 10 +CSV_Export: 0 +CSV_ExtendedHeader: 1 +CSV_Header: 1 +CSV_SaveZeroPower: 1 +CSV_Delimiter: semicolon +CSV_Spot_TimeSource: Inverter +CSV_Spot_WebboxHeader: 0 +SQL_Database: SBFspot +SQL_Hostname: Your_MariaDB_Host (usually your homeassistant hostname or IP) +SQL_Port: '3306' +SQL_Username: sbfspot +SQL_Password: Your_MariaDB_Password +MQTT_Publisher: /usr/bin/mosquitto_pub +MQTT_Host: Your_MariaDB_Host (usually your homeassistant hostname or IP) +MQTT_Port: '1883' +MQTT_Username": !secret mqtt_user, +MQTT_Password": !secret mqtt_pass, +MQTT_Topic: homeassistant/sbfspot_{plantname}/sbfspot_{serial} +MQTT_ItemFormat: '"{key}": {value}' +MQTT_ItemDelimiter: comma +MQTT_PublisherArgs: '-h Your_MQTT_Hostname -u Your_MQTT_Username -P Your_MQTT_password -t {topic} -m "{{message}}" -d -r' +MQTT_Data: >- + Timestamp,SunRise,SunSet,InvSerial,InvName,InvTime,InvStatus,InvTemperature,InvGridRelay,EToday,ETotal,PACTot,UDC1,UDC2,IDC1,IDC2,PDC1,PDC2 +LogDir: /data/sbfspot/log +LogLevel: info +PVoutput_SID: '00000000000:11111' #Your_Inverter_Serial:Your_PVoutput_SID +PVoutput_Key: Your_PVoutput_API_key +MQTT_ENABLE: '1' diff --git a/.images/Example_config_png.PNG b/.images/Example_config_png.PNG new file mode 100644 index 0000000..bf8a3db Binary files /dev/null and b/.images/Example_config_png.PNG differ diff --git a/.images/MariaDB setup.PNG b/.images/MariaDB setup.PNG new file mode 100644 index 0000000..a322c3c Binary files /dev/null and b/.images/MariaDB setup.PNG differ diff --git a/.images/sbfspot_sensors.yaml b/.images/sbfspot_sensors.yaml new file mode 100644 index 0000000..61cf943 --- /dev/null +++ b/.images/sbfspot_sensors.yaml @@ -0,0 +1,124 @@ +sensor: + - platform: mqtt + name: "SMA Output" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.status }}' + json_attributes_topic: "sbfspot" + + - platform: mqtt + name: "SMA Sunny Boy" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.InvName }}' + icon: "mdi:flash" + + - platform: mqtt + name: "SMA TimeStamp" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.Timestamp }}' + icon: "mdi:clock" + + - platform: mqtt + name: "SMA Sun Rise" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.SunRise }}' + icon: "mdi:weather-sunny" + + - platform: mqtt + name: "SMA Sun Set" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.SunSet }}' + icon: "mdi:weather-sunset-down" + + - platform: mqtt + name: "SMA Running Temp" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.InvTemperature }}' + unit_of_measurement: "°C" + icon: "mdi:coolant-temperature" + device_class: temperature + + - platform: mqtt + name: "SMA Status" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.InvStatus }}' + icon: "mdi:flash" + + - platform: mqtt + name: "SMA Grid Relay" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.InvGridRelay }}' + icon: "mdi:electric-switch" + + - platform: mqtt + name: "SMA Daily Energy" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.EToday }}' + unit_of_measurement: "kWh" + icon: "mdi:solar-power" + device_class: energy + state_class: total_increasing + + - platform: mqtt + name: "SMA Total Energy" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.ETotal }}' + unit_of_measurement: "kWh" + device_class: energy + state_class: total_increasing + + - platform: mqtt + name: "SMA Power AC" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.PACTot }}' + unit_of_measurement: "W" + icon: "mdi:flash" + device_class: power + state_class: measurement + + - platform: mqtt + name: "SMA DC Array" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.UDC1 }}' + unit_of_measurement: "Volts" + icon: "mdi:solar-panel-large" + device_class: voltage + + - platform: mqtt + name: "SMA DC Array2" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.UDC2 }}' + unit_of_measurement: "Volts" + icon: "mdi:solar-panel" + device_class: voltage + + - platform: mqtt + name: "SMA DC Array" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.IDC1 }}' + unit_of_measurement: "Amps" + icon: "mdi:solar-panel-large" + device_class: current + + - platform: mqtt + name: "SMA DC Array2" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.IDC2 }}' + unit_of_measurement: "Amps" + icon: "mdi:solar-panel" + device_class: current + + - platform: mqtt + name: "SMA DC Array" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.PDC1 }}' + unit_of_measurement: "Watts" + icon: "mdi:solar-panel-large" + device_class: power + + - platform: mqtt + name: "SMA DC Array2" + state_topic: "homeassistant/sbfspot_YOUR_PLANT_NAME/sbfspot_YOUR_INVERTER_SERIAL" + value_template: '{{ value_json.PDC2 }}' + unit_of_measurement: "Watts" + icon: "mdi:solar-panel" + device_class: power diff --git a/.images/screenshot.png b/.images/screenshot.png new file mode 100644 index 0000000..fd47cbb Binary files /dev/null and b/.images/screenshot.png differ