Supla - MQTT - Dashing

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
Pablo1
Posty: 9
Rejestracja: śr lis 27, 2019 12:54 pm

pn gru 23, 2019 9:30 pm

Już sobie poradziłem.
Trzeba było usunąć dokera mosquito i uruchomić ponownie i jest ok. :D
Pablo1
Posty: 9
Rejestracja: śr lis 27, 2019 12:54 pm

pn gru 23, 2019 9:32 pm

ale nie zmieniałem pliku config_template.yaml
Pablo1
Posty: 9
Rejestracja: śr lis 27, 2019 12:54 pm

pn gru 23, 2019 9:51 pm

Serwis dla klienta supli uruchomiony.
Wszystko wstało po restarcie malinki.

Beku dzięki za szybką reakcję, wspaniała robota! :D
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

wt gru 24, 2019 6:52 am

Pablo1 pisze:
pn gru 23, 2019 9:51 pm
Serwis dla klienta supli uruchomiony.
Wszystko wstało po restarcie malinki.

Beku dzięki za szybką reakcję, wspaniała robota! :D
A nie jest przypadkiem tak że usuwając kontener z MQTT usunąłeś sobie też konfiguracje hasła z niego? I po postawieniu na nowo masz bez hasła i dlatego klient się łączy?

Generalnie w pliku konfiguracyjnym config_template.yaml (tam gdzie wpisujesz konfiguracje supli i mqtt) można wpisać użytkownika i hasło do mqtt jeśli zabezpieczasz brokera w ten sposób.
tomekk87
Posty: 66
Rejestracja: pt sie 02, 2019 12:19 pm

pt gru 27, 2019 9:27 am

Witam. Mam prośbę do @Beku. Z Twoją pomocą udało mi się uruchomić całość. Wszystko działa super tylko chcę zrobić widgety do sterowania roletami. Masz może jakiegoś gotowca na którym można się wzorować? :D
Pozdrawiam
Tomek
Pablo1
Posty: 9
Rejestracja: śr lis 27, 2019 12:54 pm

pt gru 27, 2019 9:42 pm

Witam.
Mam kolejne pytania.
Próbuję dodać do smashingu widget pogodowy wg instrukcji stąd: https://github.com/Smashing/smashing/wi ... al-Widgets.
Pobieram api key, wpisuje położenie geograficzne, ale ciągle nie mam wyświetlonych wartości. Próbowałem wszystkich widgetów pogodowych, z każdym to samo. Trzeba w tym smashingu wykonać jakieś dodatkowe czynności, np restart dockera? Bo już nie mam pomysłu.
Próbowałem również dodać temperaturę CPU maliny. Przerobiłem trochę skrypt znaleziony w necie:

Kod: Zaznacz cały

#!/usr/bin/env python3.5
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_temp():
    temp = check_output(["vcgencmd","measure_temp"]).decode("UTF-8")
    return(findall("\d+\.\d+",temp)[0])

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.0.200")

temp = get_temp()
publish_message("supla/channels/status/thermometer/100",'{"id":100,"caption":pi,"temperature":'+temp+'"online":1}')
Temperatura publikuje się jak termometr o id:100, widzę to w mqqt explorerze, ale niestety nie widzę wartości w smashingu, jest "nan".
Co robię nie tak?

Mam też taki pomysł żeby ze zebranych danych policzyć chwilową moc grzania i wyświetlić /(temp zasilania - temp powrotu) * przepływ cieczy * współczynnik/ mniejsza o wzór.
Może jakieś sugestie jak to zrobić.
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

pn gru 30, 2019 5:00 pm

tomekk87 pisze:
pt gru 27, 2019 9:27 am
Witam. Mam prośbę do @Beku. Z Twoją pomocą udało mi się uruchomić całość. Wszystko działa super tylko chcę zrobić widgety do sterowania roletami. Masz może jakiegoś gotowca na którym można się wzorować? :D
Pozdrawiam
Tomek
Sorki że dopiero teraz, ale przegapiłem że coś tutaj nowego się pojawiło.

https://github.com/smar000/openhab-dash ... lershutter

tutaj masz widget z roletami, ale trzeba go zmodyfikować pod MQTT.

Trzeba też zmodyfikować samo hc_mqtt.rb bo ono jest przygotowane do publikowania tylko stanów przyciskow.

Najlepiej sobie skopiować metode post i ją zmodyfikować pod rollershuter tak jak poniżej (do przetestowania)

Kod: Zaznacz cały

post '/mqtt/publish/roller_shutter' do
  id = params['id']
  state = params['state']
  topic = "supla/channels/command/rollershuter/#{id}"
  message = "{\"id\" : #{id}, \"shut\" : #{state} }"
  begin
    client.publish(topic, message)
  rescue MQTT::NotConnectedException
    client.connect()
    retry
  rescue => e
    puts e.message
  end
end


natomiast plik rollershutter.coffe to coś w ten deseń::

Kod: Zaznacz cały


class Dashing.Ohrollershutter extends Dashing.ClickableWidget
  constructor: ->
    super
    @queryState()

  @accessor 'state',
    get: -> @_state ? '0'
    set: (key, value) -> @_state = value


  @accessor 'icon',
    get: -> if @['icon'] then @['icon'] else
      if parseInt(@get('state')) > 0 then @get('iconon') else @get('iconoff')
    set: Batman.Property.defaultAccessor.set

  @accessor 'iconon',
    get: -> @['iconon'] ? 'circle'
    set: Batman.Property.defaultAccessor.set

  @accessor 'iconoff',
    get: -> @['iconoff'] ? 'circle-thin'
    set: Batman.Property.defaultAccessor.set

  @accessor 'icon-style', ->
    if parseInt(@get('state')) >0 then 'rollershutter-icon-on' else 'rollershutter-icon-off' 

  plusLevel: ->
    newLevel = parseInt(@get('state'))-10
    if newLevel > 100
      newLevel = 100
    else if newLevel < 0
      newLevel = 0
    @set 'state', newLevel
    return @get('state')

  minusLevel: ->
    newLevel = parseInt(@get('state'))+10
    if newLevel > 100
      newLevel = 100
    else if newLevel < 0
      newLevel = 0
    @set 'state', newLevel
    return @get('state')

  levelUp: ->
    newLevel = @plusLevel()
    $.post '/mqtt/publish/roller_shutter',
      id: @get('device'),
      state: newLevel    

  levelDown: ->
    newLevel = @minusLevel()
    $.post '/mqtt/publish/roller_shutter',
      id: @get('device'),
      state: newLevel     

  toggleState: ->
    newState = if @get('state') > 0  then '0' else '80'
    @set 'state', newState
    return newState

  queryState: ->
       @set 'state', @get('shut')
    
  postState: ->
    newState = @toggleState()
    $.post '/mqtt/publish/roller_shutter',
      id: @get('device'),
      state: newState     

  ready: ->

  onData: (data) ->
    debugger

  onClick: (event) ->
    if event.target.id == "level-down"
      @levelDown()
    else if event.target.id == "level-up"
      @levelUp()
    else if event.target.id == "switch"
      @postState()


ale robiłem to na sucho więc to raczej z palca nie zadziała ;)
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

pn gru 30, 2019 5:03 pm

Pablo1 pisze:
pt gru 27, 2019 9:42 pm
Witam.
Mam kolejne pytania.
Próbuję dodać do smashingu widget pogodowy wg instrukcji stąd: https://github.com/Smashing/smashing/wi ... al-Widgets.
Pobieram api key, wpisuje położenie geograficzne, ale ciągle nie mam wyświetlonych wartości. Próbowałem wszystkich widgetów pogodowych, z każdym to samo. Trzeba w tym smashingu wykonać jakieś dodatkowe czynności, np restart dockera? Bo już nie mam pomysłu.
Próbowałem również dodać temperaturę CPU maliny. Przerobiłem trochę skrypt znaleziony w necie:

Kod: Zaznacz cały

#!/usr/bin/env python3.5
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_temp():
    temp = check_output(["vcgencmd","measure_temp"]).decode("UTF-8")
    return(findall("\d+\.\d+",temp)[0])

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.0.200")

temp = get_temp()
publish_message("supla/channels/status/thermometer/100",'{"id":100,"caption":pi,"temperature":'+temp+'"online":1}')
Temperatura publikuje się jak termometr o id:100, widzę to w mqqt explorerze, ale niestety nie widzę wartości w smashingu, jest "nan".
Co robię nie tak?

Mam też taki pomysł żeby ze zebranych danych policzyć chwilową moc grzania i wyświetlić /(temp zasilania - temp powrotu) * przepływ cieczy * współczynnik/ mniejsza o wzór.
Może jakieś sugestie jak to zrobić.
Ja mam zrobiony skrypt z temperaturą zrobiony taki:

Kod: Zaznacz cały

#!/bin/bash

temp=$(vcgencmd measure_temp | egrep -o '[0-9]*\.[0-9]*')

curl -d '{"auth_token":"token", "temperature": '$temp'}' -H "Content-Type: application/json" -X POST http://192.168.2.216:3030/widgets/rasptemp
nie musisz tego wysyłać do MQTT, wystarczy że wyślesz bezpośrednio do dashing (on obsługuje SSE).
Skrypt mam odpalony w cronie

Kod: Zaznacz cały

/1 * * * * /home/pi/rasptemdashing.sh
ten auth_token to tam musisz wpisać to co masz wpisane w pliku config.ru (główny katalog smashing). Tam jest token autoryzacyjny.

no i sam plik default.erb tam mam wpisane:

Kod: Zaznacz cały

 <li data-row="4" data-col="4" data-sizex="1" data-sizey="1">
      <div data-id="rasptemp" data-view="Ohtemp" data-title="Rpi"></div>
    </li>


co do pogody, niestety nie odpowiadam za te widgety - powinny działać wg opisów autorów. generalnie jak coś zmieniasz w smashing to musisz kontener restartować albo przynajmniej smashing'a w ramach kontenera (jednak zrestartowanie kontenera jest łatwiejsze).
tomekk87
Posty: 66
Rejestracja: pt sie 02, 2019 12:19 pm

wt gru 31, 2019 3:29 pm

Beku pisze:
pn gru 30, 2019 5:00 pm
tomekk87 pisze:
pt gru 27, 2019 9:27 am
Witam. Mam prośbę do @Beku. Z Twoją pomocą udało mi się uruchomić całość. Wszystko działa super tylko chcę zrobić widgety do sterowania roletami. Masz może jakiegoś gotowca na którym można się wzorować? :D
Pozdrawiam
Tomek
Sorki że dopiero teraz, ale przegapiłem że coś tutaj nowego się pojawiło.

https://github.com/smar000/openhab-dash ... lershutter

tutaj masz widget z roletami, ale trzeba go zmodyfikować pod MQTT.

Trzeba też zmodyfikować samo hc_mqtt.rb bo ono jest przygotowane do publikowania tylko stanów przyciskow.

Najlepiej sobie skopiować metode post i ją zmodyfikować pod rollershuter tak jak poniżej (do przetestowania)

Kod: Zaznacz cały

post '/mqtt/publish/roller_shutter' do
  id = params['id']
  state = params['state']
  topic = "supla/channels/command/rollershuter/#{id}"
  message = "{\"id\" : #{id}, \"shut\" : #{state} }"
  begin
    client.publish(topic, message)
  rescue MQTT::NotConnectedException
    client.connect()
    retry
  rescue => e
    puts e.message
  end
end


natomiast plik rollershutter.coffe to coś w ten deseń::

Kod: Zaznacz cały


class Dashing.Ohrollershutter extends Dashing.ClickableWidget
  constructor: ->
    super
    @queryState()

  @accessor 'state',
    get: -> @_state ? '0'
    set: (key, value) -> @_state = value


  @accessor 'icon',
    get: -> if @['icon'] then @['icon'] else
      if parseInt(@get('state')) > 0 then @get('iconon') else @get('iconoff')
    set: Batman.Property.defaultAccessor.set

  @accessor 'iconon',
    get: -> @['iconon'] ? 'circle'
    set: Batman.Property.defaultAccessor.set

  @accessor 'iconoff',
    get: -> @['iconoff'] ? 'circle-thin'
    set: Batman.Property.defaultAccessor.set

  @accessor 'icon-style', ->
    if parseInt(@get('state')) >0 then 'rollershutter-icon-on' else 'rollershutter-icon-off' 

  plusLevel: ->
    newLevel = parseInt(@get('state'))-10
    if newLevel > 100
      newLevel = 100
    else if newLevel < 0
      newLevel = 0
    @set 'state', newLevel
    return @get('state')

  minusLevel: ->
    newLevel = parseInt(@get('state'))+10
    if newLevel > 100
      newLevel = 100
    else if newLevel < 0
      newLevel = 0
    @set 'state', newLevel
    return @get('state')

  levelUp: ->
    newLevel = @plusLevel()
    $.post '/mqtt/publish/roller_shutter',
      id: @get('device'),
      state: newLevel    

  levelDown: ->
    newLevel = @minusLevel()
    $.post '/mqtt/publish/roller_shutter',
      id: @get('device'),
      state: newLevel     

  toggleState: ->
    newState = if @get('state') > 0  then '0' else '80'
    @set 'state', newState
    return newState

  queryState: ->
       @set 'state', @get('shut')
    
  postState: ->
    newState = @toggleState()
    $.post '/mqtt/publish/roller_shutter',
      id: @get('device'),
      state: newState     

  ready: ->

  onData: (data) ->
    debugger

  onClick: (event) ->
    if event.target.id == "level-down"
      @levelDown()
    else if event.target.id == "level-up"
      @levelUp()
    else if event.target.id == "switch"
      @postState()


ale robiłem to na sucho więc to raczej z palca nie zadziała ;)
Dzięki za podjęcie się w ogóle próby pomocy w tym temacie. Zrobiłem wszystko zgodnie z sugestią i jak na razie nie ruszyło. Przedstawiam kilka fotek. Widget do sterowania się pojawiła, ale roleta nie reaguje. Jak będziesz miał chwilę i chęci to proszę o kolejne sugestie co zmienić, aby to ruszyło.

Pozdrawiam i Życzę Szczęśliwego Nowego Roku.
Załączniki
img_003.JPG
img_003.JPG (86.12 KiB) Przejrzano 280 razy
img_002.JPG
img_002.JPG (98.74 KiB) Przejrzano 280 razy
img_001.JPG
img_001.JPG (130.4 KiB) Przejrzano 280 razy
desaint
Posty: 31
Rejestracja: pn maja 27, 2019 9:46 am

wt gru 31, 2019 3:41 pm

mnie zastanawia czemu masz 5 stopni w domu a 22 na balkonie... :lol:
ODPOWIEDZ